#include <iostream>
using namespace std;

//多态

//动物类
class Animal
{
public:
    //虚函数
    virtual void shout();
};
// 虚函数类外实现，类外不用声明virtual
void Animal::shout()
{
    cout << "动物在叫" << endl;
}

//猫类
class Cat:public Animal
{
public:
    //重写override： 函数返回值类型、函数名、参数列表，完全相同
    void shout()
    {
        cout << "喵喵喵……" << endl;
    }
};

//狗类
class Dog:public Animal
{
public:
    void shout()
    {
        cout << "汪汪汪……" << endl;
    }
};

//执行说话的函数
//地址早绑定，在编译阶段就确定了函数的地址
//如果想执行猫叫，那么这个函数地址就不能提前绑定，需要在运行阶段绑定，地址晚绑定（virtual）

//动态多态满足条件
//1、有继承关系
//2、子类要重写父类的虚函数

//动态多态使用
//父类的指针或者引用 执行子类对象
void doShout(Animal& animal)
{
    animal.shout();
    
    //想强制调用 Animal中的shout方法，使之不受多态型的影响
    animal.Animal::shout();
}

void test1()
{
    Cat cat;
    doShout(cat);//Animal& animal = cat;
    // 有virtual关键字： 喵喵喵……
    // 无virtual关键字：动物在叫
    
    
    
}

int main()
{
    test1();
    return 0;
}